from django.db import models
from django.contrib.auth.models import AbstractUser
from itsdangerous import TimedJSONWebSignatureSerializer, BadData
from django.conf import settings

from meiduo_mall.utils.BaseModel import BaseModel

# Create your models here.


# 自定义一个用户模型类(继承django用户类),需要在配置文件里配置说明 AUTH_USER_MODEL = 'users.User'
class User(AbstractUser):
    # 额外增加 mobile 字段
    mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号')

    # 新增 email_active 字段
    # 用于记录邮箱是否激活, 默认为 False: 未激活
    email_active = models.BooleanField(default=False,
                                       verbose_name='邮箱验证状态')

    # 新增
    default_address = models.ForeignKey('Address',
                                        related_name='users',
                                        null=True,
                                        blank=True,
                                        on_delete=models.SET_NULL,
                                        verbose_name='默认地址')

    class Meta:
        db_table = 'tb_users'

    def generate_verify_email_url(self):
        serialize = TimedJSONWebSignatureSerializer(settings.SECRET_KEY, expires_in=3600)
        token = serialize.dumps({'email': self.email, 'user_id': self.id})
        verify_url = settings.EMAIL_VERIFY_URL + token.decode()
        return verify_url


class Address(BaseModel):
    """
    用户地址
    """
    user = models.ForeignKey(User,
                             on_delete=models.CASCADE,
                             related_name='addresses',
                             verbose_name='用户')

    province = models.ForeignKey('areas.Area',
                                 on_delete=models.PROTECT,
                                 related_name='province_addresses',
                                 verbose_name='省')

    city = models.ForeignKey('areas.Area',
                             on_delete=models.PROTECT,
                             related_name='city_addresses',
                             verbose_name='市')

    district = models.ForeignKey('areas.Area',
                                 on_delete=models.PROTECT,
                                 related_name='district_addresses',
                                 verbose_name='区')

    title = models.CharField(max_length=20, verbose_name='地址名称')
    receiver = models.CharField(max_length=20, verbose_name='收货人')
    place = models.CharField(max_length=50, verbose_name='地址')
    mobile = models.CharField(max_length=11, verbose_name='手机')
    tel = models.CharField(max_length=20,
                           null=True,
                           blank=True,
                           default='',
                           verbose_name='固定电话')

    email = models.CharField(max_length=30,
                             null=True,
                             blank=True,
                             default='',
                             verbose_name='电子邮箱')

    is_deleted = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'tb_address'
        verbose_name = '用户地址'
        verbose_name_plural = verbose_name
        ordering = ['-update_time']


def check_verify_email(token):
    serialize = TimedJSONWebSignatureSerializer(settings.SECRET_KEY, expires_in=3600)
    try:
        data = serialize.loads(token)
    except BadData:
        # 如果传入的 token 中没有值, 则报错
        return None

    email = data.get('email')
    user_id = data.get('user_id')
    try:
        user = User.objects.get(email=email, id=user_id)
    except Exception as e:
        return None

    return user

